home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldbmp08
/
ldbmp08s.lzh
/
LDBMP4.S
< prev
next >
Wrap
Text File
|
1997-06-11
|
14KB
|
693 lines
*****************************************************************
* 16色のBMP *
*****************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xdef _Rle4_extend
.xdef _Bit4_prt
.xdef _Bit4_scroll
.xref key_chk
.xref tenkey_chk
.xref cursor_chk
.xref mouse_chk
.xref x_set
.xref y_set
.xref v_wait
.xref inf_change
.xref line_byte
.xref tate
.xref yoko
.xref crt_y
.xref x_max
.xref y_max
.xref x_pos
.xref y_pos
.xref gr_addr
.xref fi_size
.xref buff_addr
.xref kflg
.xref esc_flg
.xref next_flg
.xref scroll_key
.xref s_dot4
.text
.even
*****************************************************************
* RLE4展開 *
*****************************************************************
_Rle4_extend:
bsr tenkai
rts
*****************************************************************
* 16色表示 *
*****************************************************************
_Bit4_prt:
bsr bit4_prt
rts
*****************************************************************
* スクロール *
*****************************************************************
_Bit4_scroll:
bsr scroll
rts
*****************************************************************
* ランレングス圧縮の展開 *
*****************************************************************
tenkai:
move.l gr_addr(pc),a0 *展開元
move.l buff_addr(pc),a1
adda.l fi_size(pc),a1
movea.l a1,a2 *展開元MAX
move.l a1,d0 *展開先補正
btst.l #0,d0
beq tenkai_
addq.l #1,a1
tenkai_:
move.l a1,gr_addr *画像アドレス変更
movea.l a1,a3 *取っておく
moveq.l #0,d2
moveq.l #0,d3
moveq.l #$f,d7
tenkai0:
cmpa.l a0,a2
bls tenkai9
moveq.l #0,d0
move.b (a0)+,d0
beq tenkai2
move.b (a0)+,d1
subq.w #1,d0
tenkai1:
rol.b #4,d1
bsr set
dbra.w d0,tenkai1
bra tenkai0
tenkai2:
moveq.l #0,d0
move.b (a0)+,d0
cmp.b #1,d0
bcs tenkai5
beq tenkai9
* cmp.b #2,d0 *無視
* bne tenkai2_
* addq.l #2,a0
* bra tenkai0
tenkai2_:
btst.l #0,d0 *偶数か
bne tenkai4 *違う
tenkai3:
lsr.w #1,d0
subq.w #1,d0
move.w d0,d5
tenkai3_:
move.b (a0)+,d1
rol.b #4,d1
bsr set
rol.b #4,d1
bsr set
dbra.w d0,tenkai3_
btst.l #0,d5
bne tenkai3__
addq.l #1,a0
tenkai3__:
bra tenkai0
tenkai4:
cmp.w #1,d0
bne tenkai4_
move.b (a0)+,d1
rol.b #4,d1
bsr set
addq.l #1,a0
bra tenkai0
tenkai4_:
lsr.w #1,d0
subq.w #1,d0
move.w d0,d5
tenkai4__:
move.b (a0)+,d1
rol.b #4,d1
bsr set
rol.b #4,d1
bsr set
dbra.w d0,tenkai4__
move.b (a0)+,d1
rol.b #4,d1
bsr set
btst.l #0,d5
beq tenkai4___
addq.l #1,a0
tenkai4___:
bra tenkai0
tenkai5:
tst.w d3
beq tenkai5_
bsr set
tenkai5_:
adda.w line_byte(pc),a3 *展開アドレスの補正
movea.l a3,a1
bra tenkai0
tenkai9:
tst.w d3
beq tenkai9_
bsr set
tenkai9_:
rts
set:
move.w d1,d4
and.w d7,d4
rol.w #4,d2
or.w d4,d2
not.w d3
bne set9
move.b d2,(a1)+
moveq.l #0,d2
set9:
rts
*****************************************************************
* 表示 *
*****************************************************************
bit4_prt:
movea.l gr_addr(pc),a1 *グラフィックデータの先頭
move.w x_pos(pc),gram_x *GRAMの表示座標
move.w y_pos(pc),gram_y
clr.w bmp_x *BMPの表示座標(x,y)
clr.w bmp_y
move.w yoko(pc),d0
cmp.w #1024,d0
bcs bit4_prt1
move.w #1024,d0
bit4_prt1:
move.w d0,bmp_xd *bmp_xdot
move.w tate(pc),d7
cmp.w #1024,d7
bcs bit4_prt2
move.w #1024,d7
bit4_prt2:
move.w d7,bmp_yd *bmp_ydot
** sub.w crt_y(pc),d7 *自動スクロール用
move.w tate(pc),d0 *グラフィックデータの先頭アドレス
subq.w #1,d0 *(tate-1-bmp_x)*line_byte+gr_addr
sub.w bmp_x(pc),d0
mulu.w line_byte(pc),d0
add.l gr_addr(pc),d0
movea.l d0,a1
move.w gram_x(pc),d0 *表示先画像アドレス
move.w gram_y(pc),d1 *gram_y*2048+gram_x*2+$c00000
swap.w d1
clr.w d1
ror.l #5,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
adda.l #GRAM,a2
bsr bit4_put *表示
rts
bit4_put:
move.w bmp_xd(pc),d0 *横ドット数
move.w bmp_yd(pc),d2 *縦ドット数
move.w d0,d1 *表示元データの1ライン上へのバイト数
addq.w #1,d1
lsr.w #1,d1
add.w line_byte(pc),d1
movea.w d1,a3
move.w #1024,d1 *表示先データの1ライン下までのバイト数
sub.w d0,d1
add.w d1,d1
movea.w d1,a4
cmpi.b #MC68060,MPUTYPE
bcc bit4_put0
move.w d0,d1 *横ドットが16で割り切れるか
andi.w #$000f,d1
beq bit4_16 *そう
bit4_put0:
btst.l #0,d0 *横ドットが奇数か?
bne bit4_put4 *そう
subq.w #1,d2 *縦-1
lsr.w #1,d0 *横/2-1
subq.w #1,d0
bit4_put2: *横ドット=偶数
move.w d0,d1 *横ループ
bit4_put3
move.b (a1)+,d3
move.b d3,d4
lsr.b #4,d3 *上位4ビットを変換
move.w d3,(a2)+
move.w d4,(a2)+ *下位4ビットを変換
dbra d1,bit4_put3
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *変換先アドレス更新
** move.w d7,d3
** sub.w d2,d3
** bmi bit4_put3_
** move.w d3,$e8001a *スクロール
**bit4_put3_
dbra d2,bit4_put2
rts
bit4_put4: *横ドット数=奇数
subq.w #1,d2 *縦-1
lsr.w #1,d0 *横/2-1
subq.w #1,d0
bit4_put5
move.w d0,d1 *横ループ
bit4_put6
move.b (a1)+,d3
move.b d3,d4
lsr.b #4,d3 *上位4ビットを変換
move.w d3,(a2)+
move.w d4,(a2)+ *下位4ビットを変換
dbra d1,bit4_put6
move.b (a1)+,d3 *上位4ビットのみ変換
lsr.b #4,d3
move.w d3,(a2)+
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *変換先アドレス更新
** move.w d7,d3
** sub.w d2,d3
** bmi bit4_put6_
** move.w d3,$e8001a *スクロール
**bit4_put6_
dbra d2,bit4_put5
rts
bit4_16: *横ドット数が16で割り切れる時
lea.l work_buf(pc),a5 *ワークアドレス
lsr.w #4,d0 *横/16-1
subq.w #1,d0
subq.w #1,d2 *縦-1
bit4_16_0:
move.w d0,d1 *横ループ
bit4_16_1:
move.l (a1)+,d3
movep.l d3,1(a5)
ror.l #4,d3
movep.l d3,(a5)
move.l (a1)+,d3
movep.l d3,9(a5)
ror.l #4,d3
movep.l d3,8(a5)
movem.l (a5),d3-d6
movep.l d3,1(a2)
movep.l d4,9(a2)
movep.l d5,17(a2)
movep.l d6,25(a2)
lea.l 32(a2),a2
dbra.w d1,bit4_16_1
bit4_16_2:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *変換先アドレス更新
** move.w d7,d3
** sub.w d2,d3
** bmi bit4_16_put2_
** move.w d3,$e8001a *スクロール
**bit4_16_put2_
dbra.w d2,bit4_16_0
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
** move.w y_max(pc),d3
move.w d2,x_old
move.w d3,y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
tst.b esc_flg *エスケープ入力有るか
bne scroll9 *指定有り
tst.b next_flg *ネクスト入力有るか
bne scroll9 *指定有り
bsr cursor_chk *カーソルキーからの入力チェック
bsr tenkey_chk *テンキーからの入力チェック
bsr scroll_set16 *
bsr mouse_chk4 *マウスからの入力チェック
bsr lim_chk *範囲チェック
bsr go_scroll *スクロール実行
bra scroll2 *キー入力に戻る
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk4 *
scroll9:
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
move.w s_dot4(pc),-(sp)
lsr.w s_dot4
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr go_scroll
add.w s_dot4(pc),d3 *スクロール速度
cmp.w y_max(pc),d3
bls down_demo0
move.w y_max(pc),d3
bsr go_scroll
down_demo8:
move.w (sp)+,s_dot4
down_demo9:
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot4(pc),-(sp)
lsr.w s_dot4
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr go_scroll
add.w s_dot4(pc),d2 *スクロール速度
cmp.w x_max(pc),d2
bls right_demo0
move.w x_max(pc),d2
bsr go_scroll
right_demo8:
move.w (sp)+,s_dot4
right_demo9:
rts
*****************************************************************
* スクロール *
*****************************************************************
scroll_set16:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot4(pc),d3
rts
*****************************************************************
* 右上へ *
*****************************************************************
right_up:
add.w s_dot4(pc),d2
sub.w s_dot4(pc),d3
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot4(pc),d2
rts
*****************************************************************
* 右下へ *
*****************************************************************
right_down:
add.w s_dot4(pc),d2
add.w s_dot4(pc),d3
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot4(pc),d3
rts
*****************************************************************
* 左下へ *
*****************************************************************
left_down:
sub.w s_dot4(pc),d2
add.w s_dot4(pc),d3
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot4(pc),d2
rts
*****************************************************************
* 左上へ *
*****************************************************************
left_up:
sub.w s_dot4(pc),d2
sub.w s_dot4(pc),d3
rts
*****************************************************************
* マウスからの入力をチェックする *
*****************************************************************
mouse_chk4:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
beq mouse_right *押された
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_left *押された
swap d0
move.w d0,d1
andi.w #$ff00,d0
andi.w #$00ff,d1
ror.l #8,d0
ms_x_chk: *X方向の移動量を調べる
tst.b d0
beq ms_y_chk
blt ms_xm *移動量がマイナスの時飛ぶ
cmp.b #2,d0
bls ms_x_chk2
subq.b #1,d0
add.b d0,d0 *移動量を二倍にする
ms_x_chk2:
add.w d0,d2 *移動量を加算する
bra ms_y_chk
ms_xm: *移動量がマイナスのとき
neg.b d0 *移動量をプラスにする
cmp.b #2,d0
bls ms_xm2
subq.b #1,d0
add.b d0,d0 *移動量を二倍にする
ms_xm2:
sub.w d0,d2 *移動量を減算する
ms_y_chk: *Y方向の移動量を調べる
tst.b d1
beq mouse_chk_end
blt ms_ym *移動量がマイナスの時飛ぶ
cmp.b #2,d1
bls ms_y_chk2
subq.b #1,d1
add.b d1,d1 *移動量を二倍にする
ms_y_chk2:
add.w d1,d3 *移動量を加算する
bra mouse_chk_end
ms_ym: *移動量がマイナスのとき
neg.b d1 *移動量をプラスにする
cmp.b #2,d1
bls ms_ym2
subq.b #1,d1
add.b d1,d1 *移動量を二倍にする
ms_ym2:
sub.w d1,d3 *移動量を減算する
mouse_chk_end:
rts
mouse_right:
andi.w #$ff00,d0 *更に左ボタンが押されたか
bne mouse_right1 *押された
bsr inf_change *情報表示の変更
mouse_right0:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
bne mouse_right2 *押されいない
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_right1 *押された
bra mouse_right0
mouse_right1:
st esc_flg *ESCスイッチON
mouse_right2:
rts
mouse_left:
st next_flg *NEXTスイッチON
rts
*****************************************************************
* 座標の範囲チェックを行う *
*****************************************************************
lim_chk: *X座標のチェックを行う
tst.w d2
bge lim_chk2
clr.w d2
lim_chk2:
cmp.w x_max(pc),d2
bls lim_chk3
move.w x_max(pc),d2
lim_chk3: *Y座標のチェックを行う
tst.w d3
bge lim_chk4
clr.w d3
lim_chk4:
cmp.w y_max(pc),d3
bls lim_chk5
move.w y_max(pc),d3
lim_chk5:
rts
*****************************************************************
* グラフィック画面のスクロールを行う *
*****************************************************************
go_scroll:
bsr v_wait
bsr x_set
bsr y_set
rts
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
bmp_x .ds.w 1 *表示する座標(BMP)
bmp_y .ds.w 1
bmp_xd .ds.w 1 *表示するドット数
bmp_yd .ds.w 1
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
work_buf:
.ds.b 16
.even